package com.edu.repository;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.commons.io.FileUtils;
import org.aspectj.weaver.patterns.IfPointcut.IfFalsePointcut;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;

import com.edu.exception.FileException;
import com.edu.util.ZFilenameUtils;
import com.edu.vo.FileVO;
import com.edu.vo.SimpleTree;
import com.fasterxml.jackson.databind.ObjectMapper;

@Repository
public class FileRespository {

	private final Logger logger = LoggerFactory.getLogger(this.getClass());

	/**
	 * 
	 * 遍历查询文件夹下所有内容 （不使用递归，只查询一层）
	 * 
	 * @param dir
	 *            相对路径 如：访问 root目录 传入"","/",null均可 访问core目录传入core即可
	 * @return
	 */
	public List<FileVO> getDirContent(File file) {
		List<FileVO> fileList = new ArrayList<>();
		for (File f : file.listFiles()) {
			fileList.add(new FileVO(f));
		}
		return fileList;
	}

	//
	/**
	 * 创建文件 1. 文件名不能含有特殊字符 2. 文件名不能与当前的文件或文件夹重名,如果存在重名，提示用户重命名后创建
	 * 
	 * @param dir
	 * @param fileName
	 * @throws NameIllegalException
	 * @throws NameAlreadyExistsException
	 * @throws IOException
	 */
	public void createDocument(File file) throws IOException {
		File parentFile = file.getParentFile();
		parentFile.mkdirs();
		file.createNewFile();
	}

	// 用于遍历文件夹
	public void iteratorPath(String dir, SimpleTree tree) throws FileException {
		
		File file = new File(dir);
		
		if (!file.exists()) {
			throw new FileException(FileException.FILE_NOT_FOUND);
		}
		
		if (file.isDirectory()) {
			
			File[] files = file.listFiles();
			for (File f : files) {
				SimpleTree node =  new SimpleTree(f.getName());
				tree.addNode(node);
				iteratorPath(f.getAbsolutePath(), node);
			}
		
		}
		
	}

	
	

	
	// 创建目录
	public void createDir(File file) {
		file.mkdirs();
	}

	public void upload(File file) {

	}

	// 删除文件或目录
	public void deleteFile(File file) throws FileException, IOException {
		
		if (file == null || !file.exists()) {
			throw new FileException(FileException.FILE_NOT_FOUND);
		}
		FileUtils.forceDelete(file);
	}

	public void renameFile(File source, File target) throws IOException, FileException {
		// 此处慎用File#renameTo方法。原因： https://blog.csdn.net/hui_2016/article/details/73332759 
		// source.renameTo(target);
		if(source.isDirectory()) {
			FileUtils.copyDirectory(source, target);
		} else if(source.isFile()) {
			FileUtils.copyFile(source, target);
		} else {
			throw new FileException(FileException.FILE_TYPE_INCORRECT);
		}
		FileUtils.forceDelete(source);
	}

	public void copyToDir(File source, File target) throws IOException {
		FileUtils.copyToDirectory(source, target);
	}
}
